package com.ruoyi.hotel.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import com.ruoyi.hotel.mapper.HotelAccountMapper;
import com.ruoyi.hotel.domain.HotelAccount;
import com.ruoyi.hotel.service.IHotelAccountService;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.RestTemplate;

/**
 * 账号管理Service业务层处理
 * 
 * @author ruoyi
 * @date 2023-05-26
 */
@Service
public class HotelAccountServiceImpl implements IHotelAccountService 
{
    @Autowired
    private HotelAccountMapper hotelAccountMapper;

    private static Logger logger = LoggerFactory.getLogger(HotelAccountServiceImpl.class);

    /**
     * 查询账号管理
     * 
     * @param id 账号管理主键
     * @return 账号管理
     */
    @Override
    public HotelAccount selectHotelAccountById(Long id)
    {
        return hotelAccountMapper.selectHotelAccountById(id);
    }

    /**
     * 查询账号管理列表
     * 
     * @param hotelAccount 账号管理
     * @return 账号管理
     */
    @Override
    public List<HotelAccount> selectHotelAccountList(HotelAccount hotelAccount)
    {
        return hotelAccountMapper.selectHotelAccountList(hotelAccount);
    }



    /**
     * 查询账号管理列表
     *
     * @param
     * @return 账号管理集合
     */
    public List<HotelAccount> selectHotelAccountListByCtrip(){
        return hotelAccountMapper.selectHotelAccountListByCtrip();
    }

    /**
     * 新增账号管理
     * 
     * @param hotelAccount 账号管理
     * @return 结果
     */
    @Override
    public int insertHotelAccount(HotelAccount hotelAccount)
    {
        hotelAccount.setCreateTime(DateUtils.getNowDate());
        int result = hotelAccountMapper.insertHotelAccount(hotelAccount);
        this.checkHotelAccount(hotelAccount);
        return result ;
    }

    /**
     * 修改账号管理
     * 
     * @param hotelAccount 账号管理
     * @return 结果
     */
    @Override
    public int updateHotelAccount(HotelAccount hotelAccount)
    {
        hotelAccount.setUpdateTime(DateUtils.getNowDate());
        int result =  hotelAccountMapper.updateHotelAccount(hotelAccount);
        this.checkHotelAccount(hotelAccount);
        return result;
    }

    /**
     * 批量删除账号管理
     * 
     * @param ids 需要删除的账号管理主键
     * @return 结果
     */
    @Override
    public int deleteHotelAccountByIds(Long[] ids)
    {
        return hotelAccountMapper.deleteHotelAccountByIds(ids);
    }

    /**
     * 删除账号管理信息
     * 
     * @param id 账号管理主键
     * @return 结果
     */
    @Override
    public int deleteHotelAccountById(Long id)
    {
        return hotelAccountMapper.deleteHotelAccountById(id);
    }



    /**
     * 检查账号查询状态 查询酒店是否正常
     *
     * @param hotelAccount 账号管理
     * @return 结果
     */
    public void checkHotelAccount(HotelAccount hotelAccount){
        String url = hotelAccount.getRequestUrl();
        String cookiesStr = hotelAccount.getAccountCookie();

        //使用Restemplate来发送HTTP请求
        RestTemplate restTemplate = new RestTemplate();
        // json对象
        JSONObject jsonObject = new JSONObject();

        // LinkedMultiValueMap 有点像JSON，用于传递post数据，
        // MultiValueMpat<>来传递post数据
        // 但传递的数据类型有限，不能像这个这么灵活，可以传递多种不同数据类型的参数
        LinkedMultiValueMap body=new LinkedMultiValueMap();
        String param ="{\"hotelId\":"+68091728+"}";
        System.out.println(param);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // 请求体，包括请求数据 body 和 请求头 headers
        HttpEntity httpEntity = new HttpEntity(JSONObject.parseObject(param),headers);
        // 自定义cookie
        List<String> cookies = new ArrayList<>();
        cookies.add(cookiesStr);
        headers.put(HttpHeaders.COOKIE,cookies);

        //使用 exchange 发送请求，以String的类型接收返回的数据
        //ps，我请求的数据，其返回是一个json
        ResponseEntity<String> strbody = restTemplate.exchange(url, HttpMethod.POST,httpEntity,String.class);
        //解析返回的数据
        //logger.info("rsyncHotelRoomList  解析返回的数据: " + strbody.getBody());
        JSONObject jsTemp = JSONObject.parseObject(strbody.getBody());
        String result = jsTemp.getString("result");
        if(result==null || StringUtils.isEmpty(result) || !"0".equals(result)){
            //采集异常 推送消息并结束本次推送
            logger.error("采集异常 更新状态:" + result);
            logger.error("采集异常 更新状态:" + jsTemp.getString("resultMessage"));
            hotelAccount.setStatus("1");
            hotelAccount.setUpdateTime(DateUtils.getNowDate());
            hotelAccountMapper.updateHotelAccount(hotelAccount);
        }
    }
}
